<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Code Igniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package        CodeIgniter
 * @author        ExpressionEngine Dev Team
 * @copyright    Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license        http://codeigniter.com/user_guide/license.html
 * @link        http://codeigniter.com
 * @since        Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Database Utility Class
 *
 * @category    Database
 * @author        ExpressionEngine Dev Team
 * @link        http://codeigniter.com/user_guide/database/
 */
class CI_DB_forge
{

    var $fields = array();
    var $keys = array();
    var $primary_keys = array();
    var $db_char_set = '';

    /**
     * Constructor
     *
     * Grabs the CI super object instance so we can access it.
     *
     */
    function CI_DB_forge()
    {
        // Assign the main database object to $this->db
        $CI =& get_instance();
        $this->db =& $CI->db;
        log_message('debug', "Database Forge Class Initialized");
    }

    // --------------------------------------------------------------------

    /**
     * Create database
     *
     * @access    public
     * @param    string    the database name
     * @return    bool
     */
    function create_database($db_name)
    {
        $sql = $this->_create_database($db_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Drop database
     *
     * @access    public
     * @param    string    the database name
     * @return    bool
     */
    function drop_database($db_name)
    {
        $sql = $this->_drop_database($db_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Add Key
     *
     * @access    public
     * @param    string    key
     * @param    string    type
     * @return    void
     */
    function add_key($key = '', $primary = FALSE)
    {
        if (is_array($key)) {
            foreach ($key as $one) {
                $this->add_key($one, $primary);
            }

            return;
        }

        if ($key == '') {
            show_error('Key information is required for that operation.');
        }

        if ($primary === TRUE) {
            $this->primary_keys[] = $key;
        } else {
            $this->keys[] = $key;
        }
    }

    // --------------------------------------------------------------------

    /**
     * Add Field
     *
     * @access    public
     * @param    string    collation
     * @return    void
     */
    function add_field($field = '')
    {
        if ($field == '') {
            show_error('Field information is required.');
        }

        if (is_string($field)) {
            if ($field == 'id') {
                $this->add_field(array(
                    'id' => array(
                        'type' => 'INT',
                        'constraint' => 9,
                        'auto_increment' => TRUE
                    )
                ));
                $this->add_key('id', TRUE);
            } else {
                if (strpos($field, ' ') === FALSE) {
                    show_error('Field information is required for that operation.');
                }

                $this->fields[] = $field;
            }
        }

        if (is_array($field)) {
            $this->fields = array_merge($this->fields, $field);
        }

    }

    // --------------------------------------------------------------------

    /**
     * Create Table
     *
     * @access    public
     * @param    string    the table name
     * @return    bool
     */
    function create_table($table = '', $if_not_exists = FALSE)
    {
        if ($table == '') {
            show_error('A table name is required for that operation.');
        }

        if (count($this->fields) == 0) {
            show_error('Field information is required.');
        }

        $sql = $this->_create_table($this->db->dbprefix . $table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);

        $this->_reset();
        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Drop Table
     *
     * @access    public
     * @param    string    the table name
     * @return    bool
     */
    function drop_table($table_name)
    {
        $sql = $this->_drop_table($this->db->dbprefix . $table_name);

        if (is_bool($sql)) {
            return $sql;
        }

        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Rename Table
     *
     * @access    public
     * @param    string    the old table name
     * @param    string    the new table name
     * @return    bool
     */
    function rename_table($table_name, $new_table_name)
    {
        if ($table_name == '' OR $new_table_name == '') {
            show_error('A table name is required for that operation.');
        }

        $sql = $this->_rename_table($table_name, $new_table_name);
        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Column Add
     *
     * @access    public
     * @param    string    the table name
     * @param    string    the column name
     * @param    string    the column definition
     * @return    bool
     */
    function add_column($table = '', $field = array(), $after_field = '')
    {
        if ($table == '') {
            show_error('A table name is required for that operation.');
        }

        // add field info into field array, but we can only do one at a time
        // so we cycle through

        foreach ($field as $k => $v) {
            $this->add_field(array($k => $field[$k]));

            if (count($this->fields) == 0) {
                show_error('Field information is required.');
            }

            $sql = $this->_alter_table('ADD', $this->db->dbprefix . $table, $this->fields, $after_field);

            $this->_reset();

            if ($this->db->query($sql) === FALSE) {
                return FALSE;
            }
        }

        return TRUE;

    }

    // --------------------------------------------------------------------

    /**
     * Column Drop
     *
     * @access    public
     * @param    string    the table name
     * @param    string    the column name
     * @return    bool
     */
    function drop_column($table = '', $column_name = '')
    {

        if ($table == '') {
            show_error('A table name is required for that operation.');
        }

        if ($column_name == '') {
            show_error('A column name is required for that operation.');
        }

        $sql = $this->_alter_table('DROP', $this->db->dbprefix . $table, $column_name);

        return $this->db->query($sql);
    }

    // --------------------------------------------------------------------

    /**
     * Column Modify
     *
     * @access    public
     * @param    string    the table name
     * @param    string    the column name
     * @param    string    the column definition
     * @return    bool
     */
    function modify_column($table = '', $field = array())
    {
        if ($table == '') {
            show_error('A table name is required for that operation.');
        }

        // add field info into field array, but we can only do one at a time
        // so we cycle through

        foreach ($field as $k => $v) {
            // If no name provided, use the current name
            if (!isset($field[$k]['name'])) {
                $field[$k]['name'] = $k;
            }

            $this->add_field(array($k => $field[$k]));

            if (count($this->fields) == 0) {
                show_error('Field information is required.');
            }

            $sql = $this->_alter_table('CHANGE', $this->db->dbprefix . $table, $this->fields);

            $this->_reset();

            if ($this->db->query($sql) === FALSE) {
                return FALSE;
            }
        }

        return TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * Reset
     *
     * Resets table creation vars
     *
     * @access    private
     * @return    void
     */
    function _reset()
    {
        $this->fields = array();
        $this->keys = array();
        $this->primary_keys = array();
    }

}

/* End of file DB_forge.php */
/* Location: ./system/database/DB_forge.php */